home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / systems / atari / birkhahn-metafont-packed-disks / mf27-2_2e-disk2.zoo / inputs / committe.lzs / FONT1.MF next >
Text File  |  1989-12-13  |  55KB  |  2,106 lines

  1. input font1base
  2. proofing:=0; % :=1 for pts/labels, :=.5 for smoke proofs, :=0 for fontmaking!
  3. fontmaking:=1;
  4.  
  5. hppp:=722.909/72.27;
  6. vppp:=hppp;
  7. designsize:=29;
  8.  
  9. if known Xerox_world:
  10.     font_family "CLASS";
  11.     coding_scheme "ASCII LETTERS ONLY";
  12. fi
  13.  
  14. % A by Ann Lasko-Harvill
  15. vardef  char.A=
  16.   setwidth .6em;
  17.   pos1(1.3 thickwidth,45);
  18.   pos2(1.5 thickwidth,0);
  19.   x1=.3em;
  20.   y1=capheight;
  21.   x2l=.5em;
  22.   y2=0;
  23.   pos3(1.3thinwidth,75);
  24.   pos4(thinwidth,65);
  25.   x3=.1em;
  26.   y3=.55xheight;
  27.   x4=.4em;
  28.   y4=y3;
  29.   pos5(thinwidth,0);
  30.   pos6(thinwidth,-50);
  31.   x5=.1em;
  32.   y5=0;
  33.   x6=x1;
  34.   y6l=y1l;
  35.   stroke(1,2,.75,.3,.1);
  36.   stroke(3,4,.5,.23,.1);
  37.   stroke(5,6,.2,.2,.1);
  38.   labelpos(1,2,3,4,5,6);
  39. enddef;
  40.  
  41. % B by William Burley
  42. vardef char.B =
  43.       setwidth .57em;
  44.       pos1(thinwidth,90);
  45.       pos2(thinwidth,90);
  46.       pos3(.75[thinwidth,thickwidth],0);
  47.       pos4(thinwidth,-90);
  48.       pos5(thinwidth,270);
  49.       pos6(.75[thinwidth,thickwidth],180);
  50.       pos7(thinwidth,90);
  51.       pos8(thinwidth,90);
  52.       pos9(thickwidth,0);
  53.       pos10(thickwidth,0);
  54.       pos11(thinwidth,-90);
  55.       x1=x10l=x9l=x8=.17w;
  56.       x2=x4=.48w;
  57.       x5=x7=.52w;
  58.       x11=x9r;
  59.       x3=x4+.45(y2-y4);
  60.       x6=x7+.45(y5-y7);
  61.       y8l=y7l=0;
  62.       y1r=y2r=capheight;
  63.       y9=y8r;
  64.       y10=y1l;
  65.       y11=y4=y5=.52capheight;
  66.       y3=.5[y4,y2];
  67.       y6=.5[y7,y5];
  68.       dz2=(1,0); dz4=(-1,0);
  69.       dz5=(-1,0); dz7=(1,0);
  70.       stroke(1,2,0,0,0);
  71.       stroke(9,10,0,0,0);
  72.       stroke(8,7,0,0,0);
  73.       stroke(5,11,0,0,0);
  74.       curve(2,3,4);
  75.       curve(7,6,5);
  76.       labelpos(1,2,3,4,5,6,7,8,9,10,11);
  77. enddef;
  78.  
  79. % C by Arthur Samuel
  80. vardef char.C =
  81.   setwidth .7em;    % do this first; it sets the character width
  82.   pos1(thickwidth,180);
  83.   pos2(thickwidth,145);
  84.   pos3(thinwidth,90);
  85.   pos4(thinwidth,45);
  86.   pos5(.7thickwidth,0);
  87.   pos6(thickwidth,0);
  88.   pos7(thickwidth,45);
  89.   pos8(thinwidth,90);
  90.   pos9(thinwidth,135);
  91.   pos10(.7thickwidth,180);
  92.   z1=(.15w+.5thickwidth,.5capheight); dz1=(0,1);
  93. %  z2=(.22w+.5thickwidth,.83capheight);
  94.   x2=.72[x3,x1]; y2=.72[y1,y3];
  95.   z3=(.56w,capheight);  dz3=(1,0);
  96.   z4=(.650[x3,x5],.300[y3,y5]);
  97.   z5=(.83w,.8capheight); dz5=(1,-2);
  98.   z6=(.15w+.5thickwidth,.5capheight); dz6=(0,-1);
  99. %  z7=(.22w+.5thickwidth,.17capheight);
  100.   x7=.72[x8,x1]; y7=.72[y1,y8];
  101.   z8=(.56w,0); dz8=(1,0);
  102.   z9=(.650[x8,x10],.300[y8,y10]);
  103.   z10=(.83w,.2capheight);
  104.   curve(1,2,3); curve(3,4,5);
  105.   curve(6,7,8); curve(8,9,10);
  106.   labelpos(1,2,3,4,5,6,7,8,9,10);
  107. enddef;
  108.  
  109. % D by Dan Mills
  110. vardef char.D =
  111.     begingroup
  112. %  charcd := 'D;
  113.   save glyphwidth,lsb,rsb,cuthru,baseline;
  114.   numeric glyphwidth,lsb,rsb,cuthrubaseline;
  115.   baseline=0;
  116.  
  117.   glyphwidth = .5em;
  118.   lsb = .2glyphwidth;
  119.   rsb = .1glyphwidth;
  120.   cuthru = .02xheight;
  121.   setwidth( lsb+glyphwidth+rsb );
  122.  
  123. % positions:
  124.   % 1 is special
  125.   pos2(.55[thinwidth,thickwidth],45);
  126.   pos3(thickwidth,0);
  127.   pos4(.5[thinwidth,thickwidth],-45);
  128.   % 5 is special
  129.  
  130. % coordinates:
  131.   % 1 is special
  132.   x2 = lsb + .7glyphwidth;  y2 = .92capheight;
  133.   x3r = lsb + glyphwidth;    y3 = .55capheight;
  134.   x4 = lsb + .7glyphwidth;  y4 = .15capheight;
  135.   % 5 is special
  136.  
  137. % specials:
  138.   x1r = lsb;      y1r = capheight;
  139.   x1l = x1r + .85thickwidth;  y1l = y1r - thinwidth;
  140.   z1 = .5[z1l,z1r];
  141.  
  142.   x5r = lsb;      y5r = baseline;
  143.   x5l = x1r + .85thickwidth;  y5l = y5r + thinwidth;
  144.   z5 = .5[z5l,z5r];
  145.  
  146. % draw straights:
  147.   stroke(1,5,.45,.2,.2);
  148.  
  149. % add slopes for curves:
  150.   dz1 = (1,0);
  151.    dz3 = (0,-1);
  152.   dz5 = (-1,0);
  153.  
  154. % draw curves:
  155.   curve(1,2,3);
  156.   curve(3,4,5);
  157.  
  158.   labelpos(1,2,3,4,5);
  159.     endgroup;
  160. enddef;
  161.  
  162. % E by Joey Tuttle
  163. vardef char.E =
  164.   setwidth .63em;
  165.   pos1(1.5thinwidth,45); pos2(1.25thinwidth,135);
  166.   pos3(1.4thinwidth,90); pos4(.9thinwidth,90);
  167.   pos5(1.5thinwidth,-45); pos6(1.25thinwidth,-135);
  168.   pos7(thickwidth,0); pos8(thickwidth,0);
  169.   x1=w-.1em; y1r=capheight; x2=.1em;  % fixed points
  170.   y2r=y1r; x3=.95[x7,x1l]; y3=.55[y6,y2]; x4=x7; y4=y3;
  171.   x5=x1; x6=x2; y5r=0; y6r=y5r;
  172.   z7l=z6; z8l=z2;
  173.   stroke(1,2,.1,.2,0); stroke(3,4,.1,.2,.2);
  174.   stroke(5,6,.1,.2,0); stroke(7,8,.5,.15,.05);
  175.   labelpos(1,2,3,4,5,6,7,8);
  176. enddef;
  177.  
  178. % F by Pavel Curtis
  179. vardef char.F =
  180.   setwidth .6em;
  181.  
  182.   numeric len;  % clear this value for redefinition
  183.  
  184.   pos0(thickwidth, 0);
  185.   pos1(1.1thickwidth, 0);
  186.   pos2(len, 10);    % Length will be set below
  187.   pos3(thinwidth, 90);
  188.   pos4(1.5thinwidth, 120);
  189.   pos5(thinwidth, 90);
  190.   pos6(1.5thinwidth, 90);
  191.  
  192.   x1.l = 0.1em;    % Leave 0.1em sidebars
  193.   x4.r = w - 0.1em;
  194.  
  195.   z0.r = (x1.r,xheight);
  196.   y1 = capheight;
  197.   x2.l = x1.l;  x2.r = x1.r;  % This determines len, above
  198.   y2 = 0;
  199.   z3.r = (x1,capheight);
  200.   y4.r = capheight;
  201.   z5 = (x1,y6);
  202.   z6.r = (.9[x1.r, x4.r], xheight);
  203.  
  204.   % Vertical stroke
  205.     dz0 = (0,1);
  206.     stroke(0, 1, .8, .15, 0);
  207.     stroke(2, 0, .2, .15, 0);
  208.   % Top stroke
  209.     stroke(3, 4, .8, .38, 0);
  210.   % Middle stroke
  211.     stroke(5, 6, .8, .25, .25);
  212.  
  213.   labelpos(0, 1, 2, 3, 4, 5, 6);
  214. enddef;
  215.  
  216. % G by Jean-Luc Bonnetain
  217. vardef char.G =
  218.   setwidth .75em;
  219.   pos1(.5[thinwidth,thickwidth],10); % upper righmost pt of curve
  220.   pos2(.95[thinwidth,thickwidth],45); % intermediary pt for curve
  221.   pos3(1.3[thinwidth,thickwidth],90); % uppermost pt
  222.   pos4(1.3[thinwidth,thickwidth],135); % intermediary pt for curve
  223.   pos5(1.7[thinwidth,thickwidth],180); % lefmost pt
  224.   pos6(1.3[thinwidth,thickwidth],225); % intermediary pt for curve
  225.   pos7(1.3[thinwidth,thickwidth],270); % lowest pt
  226.   pos8(1.1[thinwidth,thickwidth],270); % intermediary pt for curve
  227.   pos9(.6thinwidth/(thickwidth-thinwidth)[thinwidth,thickwidth],270);
  228.        % lower righmost pt of curve
  229.   pos10(.5[thinwidth,thickwidth],10);% junction pt for 2 strokes
  230.   pos11(.5[thinwidth,thickwidth],0); % lowest pt vertical stroke
  231.   pos12(.5[thinwidth,thickwidth],90);
  232.   pos13(.5[thinwidth,thickwidth],80);
  233.  
  234.   x1r = x10r = x12 = w - .1em ; y1 = 8/15[y3,y5];
  235.   x2 = .707[x3,x1]; y2 = .707[y1,y3];
  236.   x3 = x7; y3r = 1.05capheight;
  237.   x4 = x6; y4 = .707[y5,y3];
  238.   x5r = .1em ; y5 = 1/2capheight;
  239.   x6 = .707[x7,x5] ; y6 = .707[y5,y7];
  240.   x7 = 1/2[x5,x1]; y7r = -.05capheight;
  241.         x8 = .53[x7,x1]; y8 = .85[y91,y7]; % .707 --> .5
  242.   y91 = 3/5[y7,y5];
  243.   x9 = x1l + .02w; y9 = 11/16y91;
  244.   y10 = y7r;
  245.   x11 = x10 ; y11 = y12 = y13 = 7/8y5;
  246.   x13 = x12 -.25w;
  247.  
  248.    dz1 = (0,1);
  249.   dz3 = (-1,0);
  250.   dz5 = (0,-1);
  251.   dz7 = (1,0);
  252.  
  253.   curve(1,2,3);
  254.   curve(3,4,5);
  255.   curve(5,6,7);
  256.   curve(7,8,9);
  257.   stroke(10,11,0,0,0);
  258.   stroke(12,13,0,0,0);
  259.  
  260.   labelpos(1,2,3,4,5,6,7,8,9,10,11,12,13);
  261.  
  262. enddef;
  263.  
  264. % H by John Hershberger
  265. vardef char.H =
  266.  
  267. % The capital H is just not as nice as the small j.  It is not very interesting
  268. % to the eye, and is in fact rather blocky and ugly in some of its
  269. % incarnations.  Sigh.
  270.  
  271. lwidth := thickwidth;    % Left and right verticals are different
  272. rwidth := .5[thinwidth,thickwidth];  % ...widths
  273.  
  274. barheight := .8[ xheight, .5capheight];  % Bar is a bit above center
  275.  
  276. setwidth .68em;      %
  277.  
  278. % Left vertical stroke
  279. pos1( 1.1lwidth, 10 );    % To match top of U
  280. pos2( lwidth, 10 );    % and bottom, sort of
  281. x1l = .1em; y1=capheight;
  282. x2=x1; y2=0;
  283.  
  284. % Right vertical stroke
  285. pos3( 1.1rwidth, 10 );    % Different width than lvertical
  286. pos4( rwidth, 10 );
  287. x3r = w-.1em; y3=capheight;
  288. x4=x3; y4=0;
  289.  
  290. % Horizontal stroke
  291. x5=x1; y5=barheight;
  292. x6=x3; y6= .2[barheight, xheight];  % Gets steeper for bx.  May not be right.
  293. pos5(1.25thinwidth, 70 );  % Thicker thin stroke!
  294. pos6(1.25thinwidth, 80 );  % getting no wider
  295.  
  296. % Now draw it
  297. stroke( 1, 2, .2, .05, .05 );  % Slight taper below the tops of both verticals
  298. stroke( 3, 4, .2, .05, .05 );
  299. stroke( 5, 6, .5, .4, .4 );  % Noticeable taper in the horizontal
  300.  
  301. labelpos(1,2,3,4,5,6);
  302. enddef;
  303.  
  304. % I by Nori Tokusue
  305. vardef char.I =
  306.         setwidth .5em;    % temporary value
  307.         pos1(1.4thickwidth,5);
  308.         pos2(thickwidth,0);
  309.         pos3(1.4thickwidth,2.5);     % temporary value
  310.         x1=x2=x3;                    % straight I
  311.         z3=(.5w,0);             % the botom of 'I' is at the base line
  312.                                 % midway between left and right ends.
  313.         y1=capheight;
  314.         y2=.5capheight;
  315.  
  316.         %  OK now draw 'I'
  317.         stroke(1,2,.1,.24,.24);      % temporary value.
  318.         stroke(2,3,.9,.24,.24);      % temporary value (bottom half)
  319.  
  320.         labelpos(1,2,3);
  321. enddef;
  322.  
  323. % J by Lynn Ruggles
  324. vardef char.J =      % character 'J'
  325.   setwidth .5em;    % width is 1/2 em
  326.   pos1(thickwidth,0);
  327.   z1=(.2w,1/4capheight);
  328.   dz1=(0,-1);
  329.  
  330.   pos2(.7thickwidth,90);
  331.   z2=(.5[x1,x3],.01capheight);
  332.   dz2=(1,0);
  333.  
  334.   pos3(thickwidth,175);
  335.   z3=(.75w,y1);
  336.   dz3=(0,1);
  337.  
  338.   pos4(thickwidth,180);
  339.   z4=(x3,capheight);
  340.  
  341.   curve (1,2,3);
  342.   stroke (3,4,.5,.01,.01);
  343.  
  344.   labelpos(1,2,3,4,5);
  345. enddef;
  346.  
  347. % K by Dikran Karagueuzian
  348. vardef char.K =
  349.   setwidth .65em;
  350.  
  351.   pos1(1.1thickwidth,0);  % the pen starts out slightly thick
  352.   pos2(1.1thickwidth,0);  % the pen finishes with start thickness
  353.   pos3(0.8thinwidth,-75);
  354.   pos4(1.4thinwidth,0);
  355.   pos5(1.2thickwidth,0);
  356.  
  357.   x1l=x2l=.1em;
  358.   x3r=x1r-.1thickwidth;   %l edge of K
  359.   x4r=x5r=w-.1em;    %r edges of K
  360.   y1=y4=capheight;  %1 and 4 fully defined
  361.   y2=y5=0;
  362.   y3r=.5[y2,y1];
  363.   z7=.33[z3,z4];
  364.   pos7(0.9thickwidth,angle(z4-z3));
  365.   stroke(1,2,.4,.175,.085);
  366.   stroke(4,3,.3,.175,.085);
  367.   stroke(5,7,.3,.175,.085);
  368.   labelpos(1,2,3,4,5,7);  % all positions should be listed
  369. enddef;
  370.  
  371. % alternate K by Jim Bratnober
  372. vardef char.?=
  373.  setwidth .8em;
  374.  pos1(1.1thickwidth,10);
  375.  pos2(thickwidth,10);
  376.  pos3(1.4thickwidth,90);
  377.  pos4(1.6thickwidth,190);
  378.  pos5(1.1thickwidth,45);
  379.  pos6(1.3thickwidth,10);
  380.  z1=(.125w+.56thickwidth,capheight);
  381.  z2=(x1-.06thickwidth,0);
  382.  z3=.3[z2,z1];
  383.  z4=(x6-.7thickwidth,capheight);
  384.  z5=.5[z3,z4];
  385.  z6=(.875w-.7thickwidth,0);
  386.  stroke(1,2,.2,.05,.05);
  387.  stroke(4,3,.1,.1,.2);
  388.  stroke(6,5,.1,.1,.1);
  389.  labelpos(1,2,3,4,5,6);
  390. enddef;
  391.  
  392. % L by Bruce Leban
  393. vardef char.L =
  394.   setwidth 0.6em;
  395.  
  396.   bottomslant := 5;  % how much slant at bottom of vertical stroke
  397.  
  398.   x1l = 0.1em;  % left margin
  399.   y1 = capheight;
  400.   pos1 (1.15thickwidth, 10);  % semi-serif at top
  401.  
  402.   x2 = x1;  % more or less straight down
  403.   y2 = 0;
  404.   pos2 (1.05thickwidth, bottomslant);
  405.  
  406.   dz3 = (cosd bottomslant, sind bottomslant);
  407.   z3l = 0.5[z2,z2r];  % bottom of strokes align
  408.   pos3 (thinwidth,90);
  409.  
  410.   x4 = w-0.06em;  % right margin
  411.   y4l = 0;  % bottom of stroke is at baseline
  412.   pos4 (thickwidth, 85);  % grows to thickwidth
  413.  
  414.   stroke (1,2,.2,.15,.05);  % slight taper on vertical stroke
  415.   stroke (3,4,.8,0,1-thinwidth/thickwidth);
  416.     % extreme taper on horizontal
  417.     % should change to compute based on thick-thin??
  418.   labelpos (1,2,3,4);
  419. enddef;
  420.  
  421. % M by Kwang-Chun Park
  422. vardef char.M =  %draw letter "M"
  423.  
  424.      setwidth 0.7em;
  425.      pos1(thinwidth,0);
  426.      pos2(thinwidth,10);
  427.      pos3(1.1thickwidth,0);
  428.      pos4(1.1thickwidth,0);
  429.      pos5(thinwidth,0);
  430.      pos6(thinwidth,0);
  431.      pos7(1.1thickwidth,0);
  432.      pos8(1.1thickwidth,10);
  433.      y1=capheight; x1=x2;
  434.      z2l=(0.1em,0);
  435.      y3=capheight; z4=(0.5w,0);
  436.      x3l=x1;
  437.      y6=capheight; x5l=x4; y5=0;
  438.      x6r=x7; x7r=w - 0.1em;
  439.      y7=capheight;
  440.      y8=0; x8=x7;
  441.      stroke(1,2,0.3,0,0.1);
  442.      stroke(3,4,0.8,0,0.1);
  443.      stroke(5,6,0.2,0.1,0);
  444.      stroke(7,8,0.3,0.1,0);
  445.      labelpos(1,2,3,4,5,6,7,8);
  446.    % end of the fourth brush
  447.  
  448. enddef;
  449.  
  450. % N by Dave Siegel
  451. vardef char.N =
  452. begingroup
  453. save side_right, side_left, charwidth, slidex;
  454.  
  455. side_right   = .07em;  %left sidebearing.
  456. side_left   = .1em;    %right sidebearing.
  457.  
  458. charwidth  = .5em; %width of character.
  459.  
  460. slidex = .6thinwidth;
  461.  
  462.   setwidth side_left + charwidth + side_right;
  463.  
  464.  
  465.   %DRAW THE LEFT VERTICAL STEM
  466.  
  467.   pos1(1.05thickwidth,10);
  468.         pos2(1.15thickwidth,10);
  469.  
  470.   x1l  = side_left;  y1  = capheight;
  471.   x2r  = x1r;    y2  = 0;
  472.  
  473.   stroke(1,2,0.7,0.1,0.1);
  474.  
  475.  
  476.   %DRAW THE DIAGONAL STROKE
  477.  
  478.   pos3(1.05thickwidth,20);
  479.  
  480.   x3r  = side_left + charwidth;    y3  = y2;
  481.  
  482.   stroke(1,3,.5,0.1,0.1);
  483.  
  484.  
  485.   %DRAW THE RIGHT VERTICAL STEM
  486.  
  487.   pos4(1.2thickwidth,20);
  488.  
  489.   x4l  = x3l;    y4  = y1;
  490.  
  491.   stroke(4,3,.5,0.1,0.1);
  492.  
  493.  
  494.   %MARK LABELS
  495.  
  496.   labelpos(1,2,3,4);
  497. endgroup
  498. enddef;
  499.  
  500. % O by Bruce Fleischer
  501. vardef char.O =
  502.  
  503. % the O is defined by four points, at roughly the top, bottom, left and right.
  504. %The positions of the thick and thin points are controlled by the pen widths at
  505. %these points, and by the angles.  The simplest case has the pens pointing
  506. %vertically at the top and bot, and horizontally at the sides.  To slant the
  507. %counter to the left a little, we tilt the top and bottom pens clockwise, and
  508. %the side pens ccw. This will also tend to tilt the outside shape of the 'O' to
  509. %right.  To make it look more upright, we slide the top point a bit to the left,
  510. %and the bottom point a bit to the right.
  511.  
  512.   setwidth .8em;      %fairly wide - make it nice and round
  513.   ang:=80;
  514.   topwidth := thinwidth;
  515.   sidewidth := thickwidth;
  516.   topedge := .03 capheight;
  517.   sidebar := .07em;
  518.  
  519.   %  go clockwise -- r=outside, l=inside
  520.   %  z1=top,z2=r,z3=b,z4=l
  521.  
  522.   pos1(topwidth,ang);
  523.   pos2(sidewidth,90-ang);
  524.   pos3(topwidth,ang-180);
  525.   pos4(sidewidth,-90-ang);
  526.  
  527.   y1r = capheight + topedge;
  528.   y3r = -topedge;
  529.   x2r = w - sidebar;
  530.   x4r = sidebar;
  531.  
  532.   x1 = .48w; x3 = w-x1;
  533.   y2 = .5 capheight; y4 = capheight-y2;
  534.  
  535.   dz1=-dz3=z2-z4;
  536.  
  537.   curve(1,2,3); curve(3,4,1);
  538.  
  539.   labelpos(1,2,3,4);
  540. enddef;
  541.  
  542. % P by Ed Williams
  543. vardef char.P =
  544. setwidth .65em;
  545. pos1(thickwidth,0);
  546. pos2(1.05thickwidth,10);
  547. pos3(thinwidth,-90);
  548. pos4(.3[thinwidth,thickwidth],-105);
  549. pos5(.8[thinwidth, thickwidth],-140);
  550. pos6(thickwidth,180);
  551. pos7(.5[thickwidth,thinwidth],150);
  552. pos8(.2[thinwidth,thickwidth],115);
  553. pos9(thinwidth,90);
  554. z1l=(.1w,capheight);
  555. y3l=capheight;
  556. x3=x2r=x1r;y2=0;dz3=(1,.-.05);
  557. z9=(x3+.01em,.55xheight);dz9=(-1,-0.05);
  558. x6l=w-.15em;
  559. y6=.95xheight;dz6=(0,-1);
  560. x4=.5[x3,x6];y4l=.99capheight;
  561. x8=.5[x6,x9];y8=.05[y9,y6];
  562. x5=.7[x4,x6]; y5=.3[y4,y6];
  563. x7=.7[x8,x6]; y7=.3[y8,y6];
  564.  
  565. stroke(1,2,.1,.1,0);
  566. stroke(3,4,.8,0,.1);
  567. curve(4,5,6); curve(6,7,8);
  568. stroke(8,9,.2,0,.05);
  569.  
  570. labelpos(1,2,3,4,5,6,7,8,9);
  571. enddef;
  572.  
  573. % Q by Neenie Billawala
  574. vardef char.Q=
  575.   setwidth.8em;
  576.         %numeric a; %numeric b;
  577.      pos1(.85thinwidth,90-10  );  dz1=(-1,0);
  578.   pos2(.5[thinwidth,thickwidth],135+10  );
  579.   pos3(1.13thickwidth,180+10  ); dz3=(0,-1);
  580.   pos4(.5[thickwidth,thinwidth],225-10  );
  581.   pos5(.85thinwidth,270-10  );  dz5=(1,0);
  582.   pos6(.5[thinwidth,thickwidth],315+10  );
  583.   pos7(1.13thickwidth,0+10  );   dz7=(0,1);
  584.   pos8(.5[thickwidth,thinwidth],45-10  );
  585.     x1=.5w;    y1=capheight;
  586.     x2=.71[x1,x3];  y2=.71[y3,y1];
  587.     x3r=.08w;  y3=.49capheight;
  588.     x4=.71[x3,x5];  y4=.71[y5,y3];
  589.     x5=w-x1;  y5=0;
  590.     x6=.71[x5,x7];  y6=.71[y7,y5];
  591.     x7=w-x3;  y7=capheight-y3;
  592.     x8=.71[x7,x1];  y8=.71[y1,y7];
  593.   curve(1,3,5);
  594.   curve(5,7,1);
  595.     %curve(1,2,3);
  596.     %curve(3,4,5);
  597.     %curve(5,6,7);
  598.     %curve(7,8,1);
  599.   labelpos(1,2,3,4,5,6,7,8);
  600.  
  601.   pos9(.7thickwidth,60);
  602.   pos10(.85thinwidth,90);     %dz10=(z12-z9);
  603.   pos11(.8[thinwidth,thickwidth],60);
  604.   pos12(1.05thickwidth,60);
  605.   pos13(thickwidth,60);
  606.     x9l=x3l;    y9r=y5r;
  607.     z10=(x5-.05w,y5);
  608.     x11r=.5[x12,x10];  y11l=.5[y12l,y10l];
  609.     x12r=.97w;      y12r=y10l;
  610.     z12=z13r;
  611.   %curve(9,10,11);
  612.   %stroke(10,13,.9,.1,0);
  613.     dz9=(1,.4);
  614.     %dz10=(1,0);
  615.     dz12=(1,.7);
  616.   curve(9,10,12);
  617.   labelpos(9,10,11,12,13);
  618.  
  619. enddef;
  620.  
  621. % R by Renata Byl
  622. vardef char.R =
  623.    setwidth .75em;
  624.    pos1(1.1thickwidth,10);
  625.    pos2(1.05thickwidth,10);
  626.        x1=.15em;
  627.        y1=capheight;
  628.        x2=.15em;
  629.        y2=0;
  630.    pos3(thickwidth,90);
  631.    pos4(thickwidth,75);
  632.    pos5(.5[thickwidth,thinwidth],40);
  633.    pos6(.5[thickwidth,thinwidth],0);
  634.    pos7(.5[thickwidth,thinwidth],320);
  635.    pos8(thinwidth,285);
  636.    pos9(thinwidth,270);
  637.        x3r=x9=x1;
  638.        y3r=capheight;
  639.  
  640.        x4r=x8r=.3em;
  641.        y4=.95capheight;
  642.        dz4=(1,0);
  643.  
  644.        x5=.71[x4,x6];
  645.        y5=.71[y6,y4];
  646.        dz5=(1,-1);
  647.  
  648.        x6r=.45em;
  649.        y6=.80capheight;
  650.        dz6=(0,-1);
  651.  
  652.        x7=.71[x8,x6];
  653.        y7=.71[y6,y8];
  654.        dz7=(-1,-1);
  655.  
  656.        y8=.60capheight;
  657.        dz8=(-1,0);
  658.  
  659.        y9=.58capheight;
  660.  
  661.    pos10(1.05thinwidth,45);
  662.    pos11(1.2thickwidth,10);
  663.        x10=.2em;
  664.        y10=.59capheight;
  665.        x11=.47em;
  666.        y11=.02capheight;
  667.  
  668.    stroke(1,2,.1,.2,0);
  669.    stroke(3,4,0,0,0);
  670.    curve(4,5,6);
  671.    curve(6,7,8);
  672.    stroke(8,9,0,0,0);
  673.    stroke(10,11,.9,0,.2);
  674.    labelpos(1,2,3,4,5,6,7,8,9,10,11);
  675. enddef;
  676.  
  677. % S by pinch-hitter Joey Tuttle
  678. %
  679. %
  680. % Don,
  681. %  If you look at this, please don't pay too much attention to it...
  682. %  As it turns out, after dredging up a copy of font1base, the version
  683. %  Metafont available (-87) doesn't execute test. functions -- so I have
  684. %  been totally unable to look at the S and I've no idea whether my
  685. %  "tricks" will make anything other than a big mess!!
  686. %
  687. %  I'll try to get back in tomorrow to see if someone has fixed things up.
  688. %
  689. %           Joey
  690. %1984-5-26 21:50:00
  691. %
  692. %1984-5-27 20:30:00  -- Situation unchanged.  We'll keep trying....
  693. %1984-5-29 00:20:00  -- Finally -  as I expected, it was a mess...  However,
  694. %  I'll at least get something that I'm not too ashamed of.
  695. %
  696. %1984-5-29 01:05:00  -- OK, it's not perfect (especially the bold) but
  697. %  I'm happy.  (and It's too late)
  698. %
  699. vardef char.S =
  700.   setwidth .56em;
  701.   x2=.5[x4r,x5r]; y1=.54[0,capheight];  % the center of S
  702.   x3=x1=w/2;  % top and bottom also at center
  703.   y3r=1.05capheight; y2l=-.05capheight;  % centers slightly extended
  704.   x4l=.1w; y4=.6[y1,0];  % lower left
  705.   x5r=.9w; y5=.6[y1,capheight];  % upper right
  706.   x6l=x5r; y6=y4;  % center of lower curve
  707.   x7r=x4; y7=y5;  % center of top curve
  708. % This character goes 5..3..7..1..6..2..4 (top to bottom)
  709.   pos5(1.3thinwidth,45); pos3(.7thinwidth,90);
  710.   pos7(1.2thinwidth,180); pos1(1.1thickwidth,270);
  711.   pos6(1.2thinwidth,180); pos2(.7thinwidth,90);
  712.   pos4(1.3thinwidth,45);
  713.   dz3=(-1,0);dz7=(0,-1);
  714.   dz1=(3,-2);  % this one is important!
  715.   dz6=(0,-1);dz2=(-1,0);
  716.   curve(5,3,7); curve(7,1,6); curve(6,2,4);
  717.   labelpos(1,2,3,4,5,6,7);
  718. enddef;
  719.  
  720. % T by Tuan Pham
  721. vardef char.T=
  722. setwidth .75em;
  723. pos1(1.5thickwidth,45);
  724. pos2(1.2thickwidth,60);
  725. pos3(1.2thickwidth,0);
  726. pos4(1.1thickwidth,10);
  727. x1=0.125em; x2=w-0.125em;
  728. y1=y2=capheight-0.5thickwidth;
  729. x3=x4=0.5w; y3=capheight-0.5thickwidth;
  730. y4=0;
  731. stroke (1,2,.2,.3,.2);
  732. stroke (3,4,.6,.3,.2);
  733. labelpos(1,2,3,4);
  734. enddef;
  735.  
  736. % alternate T by Theresa-Marie Rhyne
  737. vardef char.exclamation=
  738.      charcode:=ASCII"!";
  739.      setwidth .75em;
  740.      pos1(1.5thickwidth,10);
  741.      pos2(1.1thickwidth,45);
  742.      pos3(1.1thickwidth,45);
  743.      pos4(1.1thickwidth,45);
  744.      z1=(.5w,0);%y1=0;
  745.      y2r=capheight; x1r=x2r;
  746.      y3r=y4r=capheight; x3r=w-x4r=.1em;
  747.      stroke(1,2,.2,.05,.05);
  748.      stroke(3,4,.2,.05,.05);
  749.      labelpos(1,2,3,4);
  750. enddef;
  751.  
  752. % U by Don Knuth
  753. vardef char.U =
  754.   setwidth .75em;
  755.   pos1(1.1thickwidth,10);
  756.   pos2(thickwidth,10);
  757.   pos3(thickwidth,40);
  758.   pos4(.5[thickwidth,thinwidth],75);
  759.   pos5(.9[thickwidth,thinwidth],130);
  760.   pos6(thinwidth,180);
  761.   pos7(1.1thinwidth,190);
  762.   x1l=.1em; x7l=w-.1em;
  763.   y1=y7=capheight;
  764.   x2=x1; y2=.3capheight; dz2=(0,-1);
  765.   x3=.75[x4,x2]; y3=.75[y2,y4];
  766.   x4r=.5[x2r,x6r]; y4l=-.05capheight; dz4=(1,0);
  767.   x5=.71[x4,x6]; y5=.71[y6,y4];
  768.   x6=x7; y6=1/3capheight; dz6=(0,1);
  769.   stroke(1,2,.2,.05,.05);
  770.   curve(2,3,4); curve(4,5,6);
  771.   stroke(6,7,.8,.05,.05);
  772.   labelpos(1,2,3,4,5,6,7);
  773. enddef;
  774.  
  775. % V by Kanchi Gopinath
  776. vardef char.V=
  777.   setwidth .75em;
  778.  
  779.   pos1(1.6thickwidth,10);
  780.   pos2(1.5thickwidth,65);
  781.   pos3(thinwidth,0);
  782.   pos4(1.1thinwidth,10);
  783.  
  784.   x1l=.1em;
  785.   x4l=w-.1em;
  786.   y1=y4=capheight;
  787.  
  788.   y2l=0;
  789.   x2l=w/2;
  790.  
  791.   x3l=x2l;
  792.   y3l=y2l;
  793.  
  794.   stroke(1,2,.1,.4,.1);
  795.   stroke(4,3,.1,.4,.1);
  796.   stroke(2,3,0,0,0);
  797.   labelpos(1,2,3,4);
  798. enddef;
  799.  
  800. % W by Stan Osborne
  801. vardef char.W =
  802.   setwidth .9em;      % set up our char width and variables
  803.  
  804.   pos1(2thickwidth,-30);    % position upper left vector vec(1)
  805.   y1 = capheight;      % don't set height as tall as an "h"
  806.   x1l = .02w;      % all the way to the left
  807.  
  808.   pos2(1.0thickwidth,-4);    % position lower left vector vec(2)
  809.   z2 = (0.325w,0);    % at baseline, center is at .3w
  810.  
  811.   stroke(1,2,.3,.2,.1);    % left most stroke
  812.  
  813.   pos3(.5[2thickwidth,2thinwidth],-88);% position middle vector vec(3)
  814.   z3l = (0.51w,1.07xheight);  % in the middle, top as high as "x"
  815.  
  816.   stroke(2,3,.4,.2,0);    % center left stroke
  817.  
  818.   pos4(.5[2thickwidth,2thinwidth],92);% position other middle vector vec(4)
  819.   z4r = z3l;      % vec(4) is a 180 of vec(3)
  820.   z4l = z3r;      %
  821.  
  822.   pos5(1.0thickwidth,0);    % position lower left vector vec(5)
  823.   z5 = (0.70w,0);      % at baseline, ceter is at .7w
  824.  
  825.   stroke(4,5,.6,0,.1);    % center right stroke
  826.  
  827.   pos6(1.5thickwidth,30);    % position upper right vector vec(6)
  828.   y6 = capheight;      % don't set height as tall as an "h"
  829.   x6r = 1.0w;      % all the way to the right
  830.  
  831.   stroke(5,6,.7,.1,.2);    % right most stroke
  832.  
  833.   labelpos(1,2,3,4,5,6);    % label the vectors (1,2,3,4,5, and 6)
  834.  
  835. enddef;
  836.  
  837. % X by Alan Spragens
  838. vardef char.X =
  839. setwidth .8em;
  840. pos1(1.5 thickwidth,10);
  841. pos2(1.8 thickwidth,10);
  842. pos3(1.5 thinwidth,10);
  843. pos4(1.8 thinwidth,10);
  844. y1=capheight;
  845. x1l=.1em;
  846. x4r=w-.1em;
  847. y4=capheight;
  848. y3=0;
  849. y2=0;
  850. x3=x1;
  851. x2=x4;
  852. stroke(1,2,.1,.1,.3);
  853. stroke(3,4,.9,.2,0);
  854. labelpos(1,2,3,4);
  855. enddef;
  856.  
  857. % Y by Arnie Olds
  858. vardef char.Y = setwidth .75em; pos1(1.2thickwidth,10);
  859. pos2(1.1thickwidth,10); pos3(2thinwidth,10);
  860. pos4(thinwidth,-5); pos5(1.5thickwidth,10);
  861. x2=.5w; x1r=x2r; z4r=z2r; x3r=w-.05em; x5l=.03em;
  862. y1=0; y2r=.75xheight; y3=y5=capheight; stroke(1,2,.3,.1,0);
  863. stroke(3,4,.1,.1,0); stroke(5,2,.1,.1,0); labelpos(1,2,3,4,5);
  864. enddef;
  865.  
  866. % Z by Malcolm Brown
  867. % This `Z' uses the Helvetica Z as its basis.
  868. % It also departs from the Helvetica design in the
  869. % hopes of creating a more interesting letter.
  870. %
  871. vardef char.Z =
  872.   setwidth .8em;           % same proportion as in Helvetica
  873.   pos1(1.5thickwidth,75);  % stroke 1 goes from 1 to 2
  874.   pos2(.6thickwidth,90);   %  (top horizontal stroke)
  875. %
  876.   pos3(1.5thickwidth,-10);   % stroke 2 goes from 3 to 4
  877.   pos4(1.5thickwidth,-10);   %  (diagonal stroke)
  878. %
  879.   pos5(.65thickwidth,90);   % stroke 3 goes from 5 to 6
  880.   pos6(1.5thickwidth,75);  %  (bottom horizontal)
  881. %
  882.     x1=.125w;              % determing position 1
  883.     y1r = capheight;
  884. %
  885.     x2=w - x1;             % determines position 2
  886.     y2r = capheight;
  887. %
  888.     x3r=x2l;               % positions 2 and 3 share a point
  889.     y3r=y2l;
  890. %
  891.     x4l=x5r;               % positions 4 and 5 share a point
  892.     y4l=y5r;
  893. %
  894.     x5=.5x1;               % determines 5
  895.     y5l=0;
  896. %
  897.     x6=w-x5;               % determines 6
  898.     y6l=0;
  899. %  %
  900.   stroke(1,2,.3,.6,0);          % top horizontal stroke
  901.   stroke(5,6,.7,0,.6);          % bottom horizontal stroke
  902.   stroke(3,4,0,0,0);            % diagonal stroke
  903. %
  904.   labelpos(1,2,3,4,5,6);
  905. enddef;
  906.  
  907. % a by Ann Lasko-Harvill
  908. vardef char.a=setwidth .5em;%       NOTE TO GRADER: THIS ISN'T AS
  909.   pos1(1.1thickwidth,10);%    FINISHED AS I WOULD LIKE IT.
  910.   x1l=.12em;
  911.   y1l=.75xheight;
  912.   dz1=(0.2,1);
  913.   pos2(.5[1.1thickwidth,.75thinwidth],-30);
  914.   x2=.24[x1,x3];
  915.   y2=.76[y1,y3];
  916. %  dz2=(1,1);
  917.   pos3(.75thinwidth,-90);
  918.   x3=.27em;
  919.   y3=xheight;
  920.   dz3=(1,0);
  921.   pos4(.25[thickwidth,.75thinwidth],-155);
  922.   x4l=.75[x3l,x5l];
  923.   y4l=.75[y5l,y3l];
  924.   dz4=(1,-1);
  925.   pos5(thickwidth,-180);
  926.   x5=.42em;
  927.   y5=y1;
  928.   dz5=(0,-1);
  929.  
  930.   pos6(thickwidth,-180);
  931.   x6=x5;
  932.   y6=y7l;
  933.   dz6=(0,-1);
  934.   pos7(1.2thickwidth,-135);
  935.   x7l=x6l;
  936.   y7r=0;
  937.   dz7=(1,-1);
  938.   pos8(1.5thickwidth,-135);
  939.   x8r=x6l;
  940.   y8l=y6;
  941.   dz8=(1,0);
  942.   pos9(thinwidth,-90);
  943.   x9=x5r+1;
  944.   y9=.65xheight;
  945.   dz9=(-1,-.05);
  946.   pos10(.5[thickwidth,thinwidth],-45);
  947.   x10=.2[x11,x9];
  948.   y10=.2[y9,y11];
  949.   dz10=(-1,-1);
  950.   pos11(thickwidth,0);
  951.   x11=.5[x1l,x1];
  952.   y11=.45[y10,y12];
  953.   dz11=(0,-1);
  954.   pos12(.35[thickwidth, thinwidth],55);
  955.   x12=.4[x11,x13];
  956.   y12l=-.01;
  957.   dz12=(1,0);
  958.   pos13(thinwidth,90);
  959.   x13=x6r+1;
  960.   y13=y6;
  961.   dz13=(1,1);
  962.   curve(1,2,3);curve(3,4,5);
  963.   stroke(5,6,.5,0,.05);curve(6,7,8);
  964.   curve(9,10,11);curve(11,12,13);
  965.   labelpos(1,2,3,4,5,13,6,7,8,9,10,11,12);
  966. enddef;
  967.  
  968. % b by Dave Siegel
  969. vardef char.b =
  970. begingroup
  971. save side_right, side_left, charwidth, slidex;
  972. save zero_width, thinner_width, half_width, corner_width;
  973.  
  974. side_right   = .07em;  %left sidebearing.
  975. side_left   = .1em;    %right sidebearing.
  976.  
  977. charwidth  = .4em; %width of character.
  978.  
  979.  
  980.  
  981. zero_width  = .01thinwidth;
  982. thinner_width  = .6thinwidth;
  983. half_width  = .9thinwidth;
  984. corner_width  = .6[thinwidth,thickwidth];
  985.  
  986. slidex = .6thinwidth;
  987.  
  988.  
  989.   setwidth side_left + charwidth + side_right;
  990.  
  991.   %DEFINE HEADINGS AT ALL POINTS ON CURVES
  992.  
  993.   dz3  = (0,-1);
  994.   dz4  = (1,-1);
  995.   dz5  = (1,0);
  996.   dz6  = (1,1);
  997.   dz7  = (0,1);
  998.   dz8  = (-1,1);
  999.   dz9  = (-1,0);
  1000.   dz10  = (-1,-1);
  1001.   dz11  = (0,-1);
  1002.  
  1003.   %DEFINE PEN RELATIONSHIPS FOR BOTH STROKES
  1004.  
  1005.   pos1(1.5thickwidth,45);
  1006.         pos2(1.05thickwidth,10);
  1007.   pos3(zero_width,0);
  1008.   pos4(thinner_width,45);
  1009.   pos5(.9half_width,90);
  1010.   pos6(corner_width,150);
  1011.   pos7(thickwidth,180);
  1012.   pos8(.9corner_width,225);
  1013.   pos9(half_width,270);
  1014.   pos10(thinner_width,315);
  1015.   pos11(zero_width,0);
  1016.  
  1017.   %DEFINE COORDINATES
  1018.   x1r  = x2r;      y1  = hheight;
  1019.   x2l  = side_left;    y2  = 0;
  1020.   x3  = x2 + slidex + .2slidex;y3  = .32xheight;
  1021.   x4  = .22[x3,x5];    y4  = .28[y5,y3];
  1022.   x5l  = .4[x3,x7];    y5  = y2r;
  1023.   x6  = .65[x5,x7];    y6  = .18[y5,y7];
  1024.   x7r  = charwidth + slidex;  y7  = .5[y5,y9];
  1025.   x8  = .65[x9,x7];    y8  = .18[y9,y7];
  1026.   x9  = .45[x3,x7];    y9  = .98[0,xheight];
  1027.   x10  = .3[x11,x9];    y10  = .2[y9,y11];
  1028.   x11  = x3;      y11  = .5xheight;
  1029.  
  1030.  
  1031.   %DRAW STEM
  1032.  
  1033.   stroke(1,2,0.1,0.2,0);
  1034.  
  1035.   %DRAW BOWL
  1036.  
  1037.   curve(3,4,5);
  1038.   curve(5,6,7);
  1039.   curve(7,8,9);
  1040.   curve(9,10,11);
  1041.   curve(11,3,3);
  1042.  
  1043.   %MARK LABELS
  1044.  
  1045.   labelpos(1,2,3,4,5,6,7,8,9,10,11);
  1046. endgroup
  1047. enddef;
  1048.  
  1049. % c by Alan Spragens
  1050. vardef char.c =
  1051. setwidth .5em;
  1052. pos1(thickwidth,90);
  1053. pos2(.8[thickwidth,thinwidth],90);
  1054. pos3(1.1 thickwidth,180);
  1055. pos4(.2[thickwidth,thinwidth],220);
  1056. pos5(1.1thickwidth,260);
  1057. z1=(w-.075em,.85 xheight);
  1058. z2=(.5w,xheight);
  1059. y3=.5 xheight;
  1060. x3l=.1em;
  1061. x4=.5w;
  1062. y4=0;
  1063. x5=w-.05em;
  1064. y5=.2xheight;
  1065. dz2=(-1,0);dz3=(0,-1);dz4=(1,0);
  1066. curve(1,2,3);curve(3,4,5);
  1067. labelpos(1,2,3,4,5);
  1068. enddef;
  1069.  
  1070. % d by Jean-Luc Bonnetain
  1071. vardef char.d =
  1072.   setwidth .6em;
  1073.   pos1(1.5[thinwidth,thickwidth],45); % top of stem
  1074.   pos2(.7[thinwidth,thickwidth],10); % bottom of stem
  1075.   pos3(.9(thinwidth/(thickwidth - thinwidth))[thinwidth,thickwidth],90);
  1076.        % junction upper part of bowl / stem
  1077.        % this is a trick here, to make sure that the junction does not
  1078.        % become too black with bold versions.
  1079. % but actually the formula gives 1.9thinwidth in all cases!
  1080.        % in the normal version, thindwidth/(thickwidth-thinwidth) = 11/4
  1081.        % while in the bolder version the value is 14/10 < 11/4
  1082.        % this way the width of the curve when it joins the stem will
  1083.        % be relatively smaller in bold version (less far of the way from
  1084.        % thinwidth and thickwidth).
  1085.        % there is a small problem due to the digitization process here:
  1086.        % in the small size / 3 together test, the bold extended version
  1087.        % has its stem widened just after the upper junction of the bowl
  1088.        % and the stem, which creates an ugly white recess (this does not
  1089.        % appear in the large size tests). Since this depends on the size
  1090.        % on the letter and on the digitizing algorithm, a solution for
  1091.        % one size will look terrible at another one, so i haven't tried
  1092.        % to fix that problem (i don't know what will happen in the actual
  1093.        % size that will be used for typesetting text with font1(version
  1094.        % -1000) ).
  1095.  
  1096.   pos4(.8[thinwidth,thickwidth],90); % uppermost pt upper part bowl
  1097.   pos5(thickwidth,180); % leftmost pt of bowl
  1098.   pos6(.8[thinwidth,thickwidth],270); % lowermost pt bottom part bowl
  1099.   pos7(.4(thinwidth/(thickwidth - thinwidth))[thinwidth,thickwidth],270);
  1100.        % junction lower part of bowl / stem
  1101.  
  1102.   x1r = x2r ; y1 = hheight;
  1103.   z2r = (w - .1em , 0);
  1104.   x3 = x2l + .05w; y3 = 7.55/10y4 ;
  1105.   x4 = x6 = 1/2[x2,x5] ; y4 = xheight;
  1106.   x5r = .1em; y5 = 1/2y4;
  1107.   y6r = -.02capheight;
  1108.         x7 = x2l + .02w; y7 = 3/10y4;
  1109.  
  1110.   dz3 = (-1,50); % avoids possible loop at z3l
  1111.         dz4 = (-1,0);
  1112.   dz5 = (0,-1);
  1113.   dz6 = (1,0);
  1114.  
  1115.   stroke(1,2,.1,.2,0);
  1116.   curve(3,4,5);
  1117.   curve(5,6,7);
  1118.  
  1119.   labelpos(1,2,3,4,5,6,7);
  1120.  
  1121. enddef;
  1122.  
  1123. % e by Dan Mills
  1124. vardef char.e =
  1125.     begingroup
  1126. %  charcd := 'e;
  1127.   save glyphwidth,lsb,rsb,cuthru;
  1128.   numeric glyphwidth,lsb,rsb,cuthru;
  1129.  
  1130.   glyphwidth = .45em;
  1131.   lsb = rsb = .2glyphwidth;
  1132.   cuthru = .02xheight;
  1133.   setwidth( lsb+glyphwidth+rsb );
  1134.  
  1135. % positions:
  1136.   pos1(thinwidth,-90);
  1137.   pos2(.1[thinwidth,thickwidth],-100);
  1138.   pos3(thickwidth,-180);
  1139.   pos4(thinwidth,-270);
  1140.     % 5 is special
  1141.   pos6(thinwidth,-90);
  1142.  
  1143. % coordinates:
  1144.   x1 = lsb + .97glyphwidth;  y1 = .2xheight;
  1145.   x2 = lsb + .55glyphwidth;  y2r = -cuthru;
  1146.   x3r = lsb;      y3 = y6;
  1147.   x4 = lsb + .5glyphwidth;  y4r = xheight + cuthru;
  1148.     % 5 is special
  1149.   x6 = x3;      y6 = .52 xheight;
  1150.  
  1151. % specials:
  1152.   x5r = lsb + glyphwidth;    y5r = y6r;
  1153.   x5l = x5r - thickwidth;    y5l = y6l;
  1154.   x5 = .5[x5l,x5r];    y5 = .5[y5l,y5r];
  1155.  
  1156.   dz1 = z2 - z1 + (0,1.5(y2-y1));
  1157.   dz2 = (-1,0);
  1158.   dz3 = (0,1);
  1159.   dz4 = (1,0);
  1160.  
  1161. % draw straights:
  1162.   stroke(5,6,0,0,0);
  1163.  
  1164. % add a slope for the curves:
  1165.   dz5 = .999[(z5-z4),(0,-1)];
  1166.  
  1167. % draw curves:
  1168.   curve(1,2,3);
  1169.   curve(3,4,5);
  1170.  
  1171.   labelpos(1,2,3,4,5,6);
  1172.     endgroup;
  1173. enddef;
  1174.  
  1175. % f by Malcolm Brown
  1176. vardef char.f =
  1177.   setwidth .35em;                  % roughly the same as Helvetica f
  1178.   pos1(1.05thickwidth,190);        % R's start on the left!
  1179.   pos2(.15[thickwidth,thinwidth],180);
  1180. %
  1181.   pos5(.80[thickwidth,thinwidth],95);
  1182.   pos7(.75[thickwidth,thinwidth],45);
  1183. %
  1184.   pos8(1.1thinwidth,80);           % stroke 8 to 9 is the crossbar
  1185.   pos9(thinwidth,80);
  1186. %
  1187.   y1=0;                % determines 1
  1188.   x1=.35w;
  1189. %
  1190.   x2=x1;               % determines 2
  1191.   y2=xheight;
  1192.   dz2=(0,1);           % heading north
  1193. %
  1194.   y5=.33[hheight,capheight];
  1195.   x5=.2[x2,x7];
  1196. %
  1197.   y7=.125[capheight,xheight];
  1198.   x7=.82w;
  1199. %
  1200. %  Crossbar
  1201. %
  1202.   y8r=xheight;         % determines 8
  1203.   x8=.33[0,x2r];
  1204. %
  1205.   y9r=xheight;         % determines 9
  1206.   x9=w-1.67x8;
  1207. %
  1208.   stroke(1,2,0,0,0);
  1209.   curve(2,5,7);
  1210.   stroke(8,9,0,0,0);
  1211. %
  1212.   labelpos(1,2,5,7,8,9);
  1213. enddef;
  1214.  
  1215. % g by Bruce Leban
  1216.  
  1217. def down  = (0,-1) enddef;
  1218. def up    = (0,1)  enddef;
  1219. def right = (1,0)  enddef;
  1220. def left  = (-1,0) enddef;
  1221. vardef circle@# (expr xc,yc,xrad,yrad,adjustpen,tilt,pentilt) =
  1222.  
  1223.   z[@#]   = (xc,yc);
  1224.   z[@#+1] = (xc+xrad*cosd (180-tilt),  yc+yrad*sind (180-tilt));
  1225.   z[@#+2] = (xc+xrad*cosd  (90-tilt),  yc+yrad*sind  (90-tilt));
  1226.   z[@#+3] = (xc+xrad*cosd   (0-tilt),  yc+yrad*sind   (0-tilt));
  1227.   z[@#+4] = (xc+xrad*cosd (-90-tilt),  yc+yrad*sind (-90-tilt));
  1228.  
  1229.   dz[@#+1] = z[@#+2] - z[@#+4];
  1230.   dz[@#+3] = z[@#+4] - z[@#+2];
  1231.  
  1232.   pos[@#+1] (adjustpen*thinwidth,  180-tilt+pentilt);
  1233.   pos[@#+2] (adjustpen*thickwidth, 90-tilt-pentilt);
  1234.   pos[@#+3] (adjustpen*thinwidth,    0-tilt+pentilt);
  1235.   pos[@#+4] (adjustpen*thickwidth,-90-tilt-pentilt);
  1236.  
  1237.   curve ([@#+1],[@#+2],[@#+3]);
  1238.   curve ([@#+3],[@#+4],[@#+1]);
  1239. enddef;
  1240.  
  1241. vardef char.g =
  1242.   setwidth 0.5em;
  1243.  
  1244.   pentilt := 20;  % degree of "tilt" for pens
  1245.  
  1246.   circle10 (
  1247.     .47w,.55xheight,  % center of circle
  1248.     (w - 0.22em)/2,    % "radius" in x direction
  1249.     .4xheight,     %          and y direction
  1250.     1,      % pen width multiplier
  1251.     0,      % don't rotate control points
  1252.     pentilt
  1253.     );
  1254.  
  1255.   xadjust := 1/3thinwidth;  % move the down stroke over xadjust
  1256.  
  1257.   % top of downstroke
  1258.   x2r = x13r + xadjust;
  1259.   y2  = xheight;
  1260.   pos2 (1.2thickwidth, 45);
  1261.  
  1262.   % bottom of down stroke and right side of descender
  1263.   x3r = x2r;    % position below pen 2
  1264.   y3  = .10xheight;  % just above base line
  1265.   pos3 (.5[thinwidth,thickwidth],pentilt);
  1266.  
  1267.   dz3 = down;  % going down at this point
  1268.  
  1269.   % bottom of descender
  1270.   x4  = .65[x5,x3];    % closer to right side of g
  1271.   y4r = -ydepth;      % positioned at -ydepth
  1272.   pos4 (thinwidth,-90+pentilt);
  1273.  
  1274.   % left side of descender
  1275.   x5r = x11r;    % x5r and x11r are really on left side
  1276.   y5  = .8[-ydepth,0];  % ends below base line
  1277.   pos5 (thickwidth,180+pentilt);
  1278.  
  1279.   stroke (2,3,0.5,0.5,0);
  1280.  
  1281.   curve (3,4,5);
  1282.  
  1283.   labelpos (2,3,4,5,10,11,12,13,14);
  1284. enddef;
  1285.  
  1286. % I had hoped to do a tradional style g, but I didn't have enough time.
  1287. %
  1288. % vardef char.var.g = etc
  1289.  
  1290. % h by Arnie Olds
  1291. vardef char.h = setwidth .6em; pos1(1.5thickwidth,45);
  1292. pos2(1.05thickwidth,10); x2l=.1em; x8l=w-.1em;
  1293. x1=x2; x3r=x2r; x7=x8; y1=hheight; y2=0; y8=0; y3=.55xheight;
  1294. y7=.7xheight; pos3(.8thinwidth,-45);
  1295. pos4(thinwidth,-55);
  1296. pos5(.25[thickwidth,thinwidth],-110); pos6(thickwidth,-150);
  1297. pos7(thickwidth,-170); pos8(1.05thickwidth,-170);
  1298. x5=.75[x3,x7]; y5l=1.05xheight; x4=.5[x3,x5]; y4=.85[y3,y5];
  1299. x6=.75[x5,x7]; y6=.33[y5,y7]; stroke(1,2,.1,.2,0);
  1300. curve(3,4,5); curve(5,6,7); dz3=(0,1); dz7=(0,-1);
  1301. dz5=(1,0); stroke(7,8,.3,0,.1); labelpos(1,2,3,4,5,6,7,8); enddef;
  1302.  
  1303. % i by Bruce Fleischer
  1304. vardef char.i =
  1305.   setwidth 1/3em;      %same width as 'l'
  1306.   botangle:=10;      %same angle at bottom of stroke
  1307.   pos1(1.15thickwidth, botangle);  %stroke of 'i' very much like 'l',
  1308.   pos2(1.05thickwidth, botangle);  %only top has same angle as bottom
  1309.   z2=(.5w,0);
  1310.   y1=xheight;
  1311.   x1r=x2r;
  1312.   stroke(1, 2, .2, .2, 0);
  1313.  
  1314.   pos3(1.15thickwidth, botangle);  %top and bottom of dot are parallel to
  1315.   pos4(1.15thickwidth, botangle);  %and same length as top of stroke
  1316.   .4[x3r,x4r] = x2r;    %keep dot from falling off to the left
  1317.   x3r=x4r-.07(hheight-xheight);  %slant sides of dot
  1318.   y4=.25[xheight,hheight];  %space dot between xheight and hheight
  1319.   y3=.55[xheight,hheight];
  1320.   stroke(3,4, 0, 0, 0);    %make it a parallelogram
  1321.  
  1322.   labelpos(1,2,3,4);
  1323. enddef;
  1324.  
  1325. % j by John Hershberger
  1326. vardef char.j =
  1327.  
  1328. lspace := .08em;  % How much space at left of j; adjust to look right
  1329. jwidth := .34em + lspace;  % Total width of character and whitespace
  1330. lcurve := .71;    % Fairly round curve at end of bottom loop
  1331. rcurve := .73;    % Squarish round curve at start of bottom loop
  1332.  
  1333. % Dot parameters  should be coordinated with 'i' dot.
  1334. dotdy := .4*(hheight-xheight);  % Height of dot
  1335. dotwidth := 1.3thickwidth;  % Width of dot
  1336. lswell := -.1;      % Reverse taper for left of dot
  1337. rswell := -.05;      % Reverse taper for right of dot
  1338. eps := -.3rswell*thickwidth;  % Amount to move dot left to make it look
  1339.         % more centered.  Try to make right side of
  1340.         % j's vertical stroke ~ bisect dot's swell.
  1341.         % We're at the level of single pixels, so it's
  1342.         % hard to make it right.
  1343.  
  1344. setwidth jwidth;
  1345. pos1( 1.5thickwidth, 45 );  % As in 'l'
  1346. pos2( thickwidth, 10 );
  1347. pos3( .7[thinwidth, thickwidth], -35 );
  1348. pos4( .3[thinwidth, thickwidth], -80 );
  1349. pos5( .15[thinwidth, thickwidth], -120 );
  1350. pos6( thinwidth, -135 );  % No slight flare at the end of j stroke
  1351.         % Slope matches top of j stroke--unimportant?
  1352. y1=xheight; x1r = w-.1em;  % Right side straight and .1 em in.
  1353.         % It would be tempting to put the top of the
  1354.         % stroke a little bit to the left so that the
  1355.         % "j" doesn't look like it's falling over
  1356.         % backward.  (See next line.)
  1357. fudge:= .005em;      % This was originally used to move the bottom
  1358.         % of the stroke right to achieve an equivalent
  1359.         % effect.  Setting fudge to .005em works fairly
  1360.         % nicely, except that the pixel-jagged right
  1361.         % edge of the
  1362.         % stroke is then a little disconcerting.
  1363. x2r=x1r+fudge; y2r = .3[-ydepth,xheight];  % Top of curve
  1364. dz2=(0,-1);      % Heading down
  1365. x3= rcurve[x4,x2]; y3 = rcurve[y2,y4];  % See below
  1366. y4r=-ydepth -.05capheight; x4l= .5[x6l,x2l];
  1367.         % Inside of curve is flat in center
  1368. dz4=(-1,0);      % Heading left
  1369. x5 = lcurve[x4,x6]; y5 = lcurve[y6,y4];
  1370. x6r = lspace; y6l = .8[-ydepth, y2r];    % Pen is flipped, curve ends just
  1371.         % below where it starts on other side.
  1372.  
  1373. % Dot definition
  1374. x7r = x1r-eps; y7 = y1+ 1.7dotdy ;  % Start 1.7dotdy above j-stroke
  1375. x8r = x7r-eps; y8 = y7 - dotdy;    % And come down dotdy.
  1376. pos7( dotwidth, 45 );    % Same slope as top of stroke
  1377. pos8( dotwidth, 45 );    % Same slope as top of stroke
  1378.  
  1379. % Draw the thing
  1380. stroke( 1, 2, .1, .2, 0 );  % To match top of 'l'
  1381. curve(2,3,4); curve(4,5,6);
  1382.  
  1383. stroke( 7, 8, .5, lswell, rswell);  % Swell out a little on the dot
  1384.  
  1385. labelpos( 1,2,3,4,5,6,7,8 );
  1386. enddef;
  1387.  
  1388. % k by Renata Byl
  1389. vardef char.k =
  1390.    setwidth .6em;
  1391.    pos1(1.5thickwidth,45);
  1392.    pos2(1.05thickwidth,10);
  1393.        z2=(.1667em,0);
  1394.        y1=hheight;  x1r=x2r;
  1395.    pos3(1.5thickwidth,90);
  1396.    pos4(1.05thickwidth,90);
  1397.        y3=.5hheight;
  1398.        y4=.75hheight;
  1399.        z3=(x2r,y3);
  1400.        z4=(.45em,y4);
  1401.    pos5(1.00thickwidth,45);
  1402.    pos6(1.05thickwidth,10);
  1403.        y5=.5hheight;
  1404.        y6=.02capheight;
  1405.        z5=(.25em,y5);
  1406.        z6=(.45em,y6);
  1407.  
  1408.    stroke(1,2,.1,.2,0);
  1409.    stroke(3,4,.9,0,.2);
  1410.    stroke(5,6,.9,.2,0);
  1411.    labelpos(1,2,3,4,5,6);
  1412. enddef;
  1413.  
  1414. % l by Don Knuth
  1415. vardef char.l =
  1416.   setwidth 1/3em;
  1417.   pos1(1.5thickwidth,45);
  1418.   pos2(1.05thickwidth,10);
  1419.   z2=(.5w,0);
  1420.   y1=hheight; x1r=x2r;
  1421.   stroke(1,2,.1,.2,0);
  1422.   labelpos(1,2);
  1423. enddef;
  1424.  
  1425. % m by Jim Bratnober
  1426. vardef char.m =
  1427. %offset:=(.3333em-thickwidth)/2;
  1428.  offset:=(.3em-thickwidth)/2;
  1429. %setwidth 1em+2offset;
  1430.  setwidth .95em;
  1431.  chwid:=w-2offset;
  1432.  pos1(1.5thickwidth,45); % upper left nub
  1433.  pos2(.9thickwidth,10);  % moving down the left vertical
  1434.  pos3(1.05thickwidth,10); % at the bottom
  1435.  pos4(.9[thickwidth,thinwidth],-50); % left hump
  1436.  pos5(.5[thickwidth,thinwidth],-105);
  1437.  pos6(thickwidth,-140);
  1438.  pos7(thickwidth,-170); % middle vertical, top
  1439.  pos8(thickwidth,10);  % duplicate since directions of pen differ
  1440.  pos9(1.1thickwidth,-170);  % bottom
  1441.  pos10(.9[thickwidth,thinwidth],-50); % right hump
  1442.  pos11(.5[thickwidth,thinwidth],-105);
  1443.  pos12(thickwidth,-140);
  1444.  pos13(thickwidth,-170); % top of right vertical
  1445.  pos14(1.05thickwidth,-170); % bottom
  1446.  
  1447. numeric xxheight;
  1448.  y1=1.02xheight;
  1449.  x1r=x2r=x3r=offset+thickwidth;
  1450.  y2=.55xxheight;
  1451.  dz2=(0,1);
  1452.  y3=0;
  1453.  x4=x2+.054chwid;
  1454.  y4=.95xxheight;
  1455.  z5=(.287chwid+offset,1.05xxheight); dz5=(1,0); y5l=1.03xheight;
  1456.  z6=(.46chwid+offset,y4);
  1457.  humpwid:=(chwid-(x3r-x3l))/2;
  1458.  z7=(x9,y2+.1xxheight);  dz7=(0,-1);
  1459.  x9l=x3r+humpwid;
  1460.  y9=0;
  1461.  z8=z7; dz8=(0,1);
  1462. % Note: instead of humpwid, better to say `x9l-x3r=x14l-x9l; x14l-x3l=chwid'!
  1463.  z10=(x7+x4-x2,y4);
  1464.  z11=(x7+x5-x2,y5); dz11=(1,0);
  1465.  z12=(x7+x6-x2,y4);
  1466.  z13=(x14,y2+.1xxheight);  dz13=(0,-1);
  1467.  x14l=x9l+humpwid;
  1468.  y14=0;
  1469.  
  1470.  stroke(1,3,.1,.3,0);
  1471.  curve(2,4,5);
  1472.  curve(5,6,7);
  1473.  stroke(7,9,0,0,0);
  1474.  curve(8,10,11);
  1475.  curve(11,12,13);
  1476.  stroke(13,14,0,0,0);
  1477.  labelpos(1,2,3,4,5,6,7,8,9,10,11,12,13,14);
  1478. enddef;
  1479.  
  1480. % n by Lynn Ruggles
  1481. vardef char.n =     % character 'n'
  1482.   setwidth .6em;    % width is slightly larger than 1/2 em
  1483.   x1=.25w; y1=xheight;
  1484.   pos1(2thickwidth,0);  % pen is thick and 0 degree angle
  1485.  
  1486.   x2=.3w; y2=y1;
  1487.   pos2(thickwidth,15);  % pen is thick and 15 degree angle
  1488.  
  1489.   pos3(1.2thickwidth,0);  % ditto
  1490.   x3=.3w; y3=0;
  1491.  
  1492.   x4=x3;   y4=2/3xheight-thinwidth;
  1493.   pos4(thickwidth,75);
  1494.   dz4=(10,11);
  1495.  
  1496.   x5=.6w; y5=xheight-.5thinwidth;
  1497.   pos5(thickwidth,60);
  1498.   dz5=(1,0);
  1499.  
  1500.   x6=.8w; y6=y4;
  1501.   pos6(1.1thickwidth,30);
  1502.   dz6=(0,-1);
  1503.  
  1504.   pos7(1.5thickwidth,0);
  1505.   x7=.85w; y7=y3;
  1506.  
  1507. %  stroke (1,2,.2,0,.30;
  1508.   stroke (1,3,.2,.8,0);
  1509.   curve (4,5,6);
  1510.   stroke (6,7,.7,0,.5);
  1511.   labelpos(1,2,3,4,5,6,7);
  1512. enddef;
  1513.  
  1514. % o by Stan Osborne
  1515. vardef char.o =
  1516.   setwidth .6em;      % make the "o" 60% of an em
  1517. numeric mythin,mymid[],mythick;
  1518.   mythin = thinwidth;
  1519.   mymid1 = .27[thinwidth,thickwidth];
  1520.   mymid2 = .75[thinwidth,thickwidth];
  1521.   mythick = thickwidth;
  1522.  
  1523.   pos1(mythin,-92);    % vertical and thin for vec(1)
  1524.   z1l = (.5w,1.05xheight);    % in the middle and top at xheight
  1525.  
  1526.   pos2(mymid1,-48);    % getting flatter for vec(2)
  1527.   x2l = .27w;      % moved over to the left
  1528.   y2l = .91y1l;      % it is  near xheight
  1529.  
  1530.   pos3(mythick,0);    % flat and thicker for vec(3)
  1531.   z3 = (.22w,.65y1l);    % moved to the left and down
  1532.  
  1533.   curve(1,2,3);      % draw the upper left curve
  1534.  
  1535.   pos4(mythick,0);    % same as vec(3) for vec(4)
  1536.   z4 = (x3,.35[y6l,y1l]);    % symetrical with z3
  1537. y6l=-.05xheight;
  1538.   stroke(3,4,.5,-.1,.1);    % left center stroke
  1539.  
  1540.   pos5(mymid1,45);    % lifting up for vec(5)
  1541.   x5l = x2l;      % moved over to the right
  1542.   y5l-y6l = y1l-y2l;      % it is near the bottom
  1543.  
  1544.   pos6(mythin,88);    % vertical and thin for vec(6)
  1545.   z6l = (.5w,-.05xheight);      % in the middle and bottom at baseline
  1546. dz6=(1,0);
  1547.   curve(4,5,6);      % draw the lower left curve
  1548.  
  1549.   pos7(mythin,-92);    % vec(7) is a 180 of vec(6)
  1550.   z7r = z6l;      % must match with vec(6)
  1551.  
  1552.   pos8(mymid1,-50);    % lifting up for veck(8)
  1553.   x8r = .97w-x5l;      % mirror image of vec(5)
  1554.   y8r = y5l;      % same height
  1555.  
  1556.   pos9(mymid2,0);      % flat and thicker for vec(9)
  1557.   z9 = (.97w-x3,y4);    % mirror of vec(4)
  1558. dz7=(1,0);
  1559.   curve(7,8,9);      % draw the lower right curve
  1560.  
  1561.   pos10(mymid2,0);    % same as vec(9)
  1562.   z10 = (x9,y3);      % mirror of vec(3)
  1563.  
  1564.   stroke(9,10,.5,.1,-.1);    % right center stroke
  1565.  
  1566.   pos11(mymid1,48);    % lifting up for vec(11)
  1567.   x11r = x8r;      % same as vec(8)
  1568.   y11r = y2l;      % same height as vec(2)
  1569.  
  1570.   pos12(mythin,88);    % vertical and thicker for vec(12)
  1571.   x12r = x1l;      % a 180 of vec(1)
  1572.   y12r = y1l;      % same height as vec(1)
  1573.  
  1574.   curve(10,11,12);    % draw the upper right curve
  1575.  
  1576.   labelpos(1,2,3,4,5,6,7,8,9,10,11,12);  % label the vectors
  1577.  
  1578. enddef;
  1579.  
  1580. % p by Theresa-Marie Rhyne
  1581. vardef char.p=
  1582.      setwidth .55em;
  1583.      pos1(1.5thickwidth,45);
  1584.      pos2(1.05thickwidth,10);
  1585.      pos3(.9thinwidth,80);
  1586.      pos4(thinwidth,80);
  1587.      pos5(thinwidth,135);
  1588.      pos6(thickwidth,180);
  1589.      pos7(thickwidth,215);
  1590.      pos8(thinwidth,250);
  1591.      pos9(.5thinwidth,270);
  1592.      z2=(.1em,xheight);
  1593.      y1=-ydepth;
  1594.      x1r=x2r; x3=x9r=.1em;
  1595.      y3=.1xheight; y9=.9xheight;
  1596.      y4=0; x4=x8=.4w;
  1597.      dz4=(1,0);
  1598.  
  1599.      y8=xheight;
  1600.          x6r=.7w;  y6l=.5xheight;
  1601.      dz6=(0,1);
  1602.      x5r=.75[x4r,x6r]; y5r=.75[y6r,y4r];
  1603.      x7=.75[x8,x6]; y7=.75[y6,y8];
  1604.  
  1605.      dz8=(-1,0);
  1606.      stroke(1,2,.1,.2,0);
  1607.      stroke(3,4,.5,-.4,.2);
  1608.      curve(4,5,6); curve(6,7,8);
  1609.      stroke(8,9,.5,-.4,.2);
  1610.      labelpos(1,2,3,4,5,6,7,8,9);
  1611. enddef;
  1612.  
  1613. % q by Pavel Curtis
  1614. vardef char.q =
  1615. %  setwidth .5em;
  1616.   setwidth .6em;
  1617.   cw := .75[thinwidth,thickwidth];  % Corner pen width
  1618.   cp := .72;      % Corner positioning coeff.
  1619.  
  1620.  
  1621.   pos1(1.5thickwidth, 45);
  1622.   pos2(thickwidth, 0);
  1623.   pos3(cw, 45);
  1624.   pos4(thinwidth, 90);
  1625.   pos5(cw, 135);
  1626.   pos6(thickwidth, 180);
  1627.   pos7(cw, 225);
  1628.   pos8(thinwidth, 270);
  1629.   pos9(cw, 315);
  1630.  
  1631.   x6.r = 0.1em;    % Again .1em sidebars
  1632.   x2.r = w - 0.1em;
  1633.  
  1634.   x1.l = x2.l;
  1635.   y1 = -ydepth;
  1636.   y2 = xheight/2;
  1637.   x4 = 1/2[x6, x2];
  1638.   y4.r = 1.05xheight;
  1639.   y6 = y2;
  1640.   x8 = x4;
  1641.   y8.r = -.05xheight;
  1642.   x3 = x9 = cp[x4, x2];
  1643.   x5 = x7 = cp[x4, x6];
  1644.   y3 = y5 = cp[y2, y4];
  1645.   y7 = y9 = cp[y2, y8];
  1646.   dz2 = (0,1);
  1647.   dz4 = (-1,0);
  1648.   dz6 = (0,-1);
  1649.   dz8 = (1,0);
  1650.  
  1651.   % Stem
  1652.     stroke(1, 2, .1, 0, .2);
  1653.   % Bowl
  1654.     curve(2, 3, 4);
  1655.     curve(4, 5, 6);
  1656.     curve(6, 7, 8);
  1657.     curve(8, 9, 2);
  1658.  
  1659.   labelpos(1, 2, 3, 4, 5, 6, 7, 8, 9);
  1660. enddef;
  1661.  
  1662. % r by Arthur Samuel
  1663. vardef char.r =
  1664.   setwidth .5em;    % do this first; it sets the character width
  1665.   pos1(1.5thickwidth,45); % the pen is "thicker than thick" at the top
  1666.   pos2(1.05thickwidth,10); % and also slightly flared at the bottom
  1667.   pos3(.8thinwidth,90);   % The starting place for the right branch
  1668.   pos4(.65[.8thinwidth,thickwidth],90);
  1669.   pos5(1.2thickwidth,90);   % Joining point of two curves
  1670.   pos6(.85[thinwidth,thickwidth],45);   % at point with slope for line 5,7
  1671.   z2=(.2w+.5thickwidth,0);
  1672.   y1=xheight; x1r=x2r; % at the hheight, aligned at the right
  1673.   x3=x2+.5thickwidth;   y3=.65xheight; dz3=(1,2);
  1674.   x4=.5[x3,x5]; y4=.83[y3,y5];
  1675.   z5=(.8w,xheight-.3thickwidth); dz5=(1,0);
  1676.  
  1677.  
  1678.   stroke(1,2,.1,.2,0); % taper at the left but not the right
  1679.   curve(3,4,5);
  1680.   labelpos(1,2,3,4,5);
  1681. enddef;
  1682.  
  1683. % s by Kwang-Chun Park
  1684. vardef char.s =
  1685.  
  1686.       setwidth 0.4em;
  1687.       pos1(thickwidth,-100);
  1688.       pos2(.5[thickwidth,thinwidth],-95);
  1689.       pos3(thinwidth,-90);
  1690.       pos4(.375[thinwidth,thickwidth],-40);
  1691.       pos5(.75[thinwidth,thickwidth],0);
  1692.       pos6(thickwidth,45);
  1693.       pos7(1.1thickwidth,75);
  1694.       pos8(thickwidth,45);
  1695.       pos9(.75[thinwidth,thickwidth],0);
  1696.       pos10(.375[thinwidth,thickwidth],-40);
  1697.       pos11(thinwidth,-90);
  1698.       pos12(.5[thinwidth,thickwidth],-95);
  1699.       pos13(thickwidth,-100);
  1700.  
  1701.       y3l=1.03xheight; y1=0.85xheight;
  1702.       y5=.75xheight; y7= 0.5xheight; y9= 0.25xheight;
  1703.       y11r= -0.03xheight; y13=y9;
  1704.       x3 = 0.5w; x1r=w-.05em;
  1705.       x5l=x3-0.5w; x7 = x3; x9r = w;
  1706.       x11 = x3; x13= x5l;
  1707.  
  1708.       x2l = 0.71[x3l,x1l];
  1709.       y2l = 0.71[y1l,y3l];
  1710.       dz3= (-1,0);
  1711.       x4l = 0.75[x3l,x5l];
  1712.       y4l = 0.75[y5l,y3l];
  1713.       dz5=(0,-1);
  1714.       x6 = 0.29[x5,x7];
  1715.       y6 = 0.29[y7,y5];
  1716.   dz7=(1,0);
  1717.       x8 = 0.29[x9,x7];
  1718.       y8 = 0.71[y9,y7];
  1719.       dz9=(0,-1);
  1720.       x10= 0.75[x11,x9];
  1721.       y10= 0.25[y11,y9];
  1722.       dz11=(-1,0);
  1723.       x12= 0.35[x13,x11];
  1724.       y12= 0.29[y11,y13];
  1725.  
  1726.       curve(1,2,3); curve(3,4,5);
  1727.       curve(5,6,7); curve(7,8,9);
  1728.       curve(9,10,11); curve(11,12,13);
  1729.       labelpos(1,2,3,4,5,6,7,8,9,10,11,12,13);
  1730.  
  1731. enddef;
  1732.  
  1733. % t by Tuan Pham
  1734. vardef char.t=
  1735. setwidth .6em;
  1736. pos1(1.1thickwidth,45);
  1737. pos2(thickwidth,10);
  1738. pos3(thickwidth,40);
  1739. pos4(.5[thickwidth,thinwidth],75);
  1740. pos5(.9[thickwidth,thinwidth],130);
  1741. pos6(thinwidth,200);
  1742. pos7(1.2thinwidth,80);
  1743. pos8(1.5thinwidth,45);
  1744. x1l=0.15em;y1=.5[xheight,hheight];
  1745. x2=x1;y2=0.25xheight;dz2=(0,-1);
  1746. x3=.71[x4,x2];y3=.71[y2,y4];
  1747. x4r=.5[x2r,x6r];y4l=-.05xheight;dz4=(1,0);
  1748. x5=.7[x4,x6];y5=.7[y6,y4];
  1749. x6l=w-0.15em;y6=0.3xheight;
  1750. x7=.1em;x8=w-.18em;
  1751. y7r=y8r=xheight;
  1752. stroke(1,2,.2,.05,.05);
  1753. curve(2,3,4);curve(4,5,6);
  1754. stroke(7,8,.8,0,.3);
  1755. labelpos(1,2,3,4,5,6,7,8);
  1756. enddef;
  1757.  
  1758. % u by Nori Tokusue
  1759. vardef char.u =
  1760.         setwidth .50em;            %temp value
  1761.         pos1(1.05thickwidth,10);
  1762.         pos2(thickwidth,10);
  1763.         pos3(.65[thickwidth,thinwidth],40);
  1764.         pos4(.80[thickwidth,thinwidth],75);
  1765.         pos5(.95[thickwidth,thinwidth],130);
  1766.         pos6(thickwidth,180);
  1767.         pos7(thickwidth,190);
  1768.         pos8(1.1thickwidth,190);
  1769.         %  coordinate information
  1770.  
  1771.         x1l=.075em;
  1772.         x7=w-x1l;
  1773.         y1=y7=xheight;
  1774.         x1=x2;
  1775.         x6=x7;x6r=x8r;
  1776.  
  1777.         % left curve
  1778.         y2=.30xheight; dz2=(0,-1);    % going down at z2
  1779.         x3=.75[x4,x2]; y3=.75[y2,y4];
  1780.         x4r=.5[x2r,x6r];  y4l=-.05xheight;
  1781.         dz4=(1,0);      % rightward
  1782.  
  1783.         % right curve
  1784.         x5=.70[x4,x6];  y5=.3[y4,y6];
  1785.         y6=.33xheight;  dz6=(0,1);      % upward at z6
  1786.         y8=0;
  1787.    % now draw the line
  1788.         stroke(1,2,.3,.05,0);     %  temp values.
  1789.         curve(2,3,4);
  1790.  
  1791.         curve(4,5,6);
  1792.         stroke(6,7,.7,0,.05);
  1793.         dy6:=-1;
  1794.         stroke(6,8,.5,.05,.05);
  1795.  
  1796.       labelpos(1,2,3,4,5,6,7,8);
  1797. enddef;
  1798.  
  1799. % v by Ed Williams
  1800. vardef char.v =
  1801. setwidth .55em;
  1802. pos1(1.1thickwidth,05); z1=(.2w,xheight);
  1803. pos5(1.3thinwidth, -170); z5=(.85w,xheight);
  1804. pos3(1.8thickwidth,87); x3l=.5[x1,x5]; y3l=-.02w;
  1805. pos2(.9thickwidth, 25);z2=.5[z1,z3];
  1806. pos4(1.1thinwidth,155); z4=.5[z5,z3];
  1807.  
  1808. stroke (1,2,.2,.05,.05); stroke(2,3,.8,0,0);
  1809. stroke(5,4,.2,.05,.05); stroke(4,3,.8,.02,0);
  1810. labelpos(1,2,3,4,5);
  1811. enddef;
  1812.  
  1813. % w by Joey Tuttle
  1814. vardef char.w =
  1815.   setwidth .74em;  % this from "average character width table" TSS
  1816.   pos1(1.5thickwidth,30);
  1817.   pos2(1.05thickwidth,10);
  1818.   pos21(thinwidth,10);
  1819.   pos3(thinwidth,30);
  1820.   pos31(thickwidth,30);
  1821.   pos4(1.05thickwidth,10);
  1822.   pos41(thinwidth,10);
  1823.   pos5(1.5thinwidth,30);
  1824.   y1=xheight; x1l=.1em; x5r=w-.1em;  % some fixed points
  1825.   x2=.45[x1,x3]; x3=.5[x1,x5]; x4=.45[x3,x5];  % relating corners
  1826.   z21r=z2r; z31l=z3l; z41r=z4r;  % tie corners of strokes
  1827.   y31r=y1; y5=y1;    % the tops of the strokes
  1828.   y2=0; y4=y2;  % the baseline
  1829.   stroke(1,2,.1,.2,0);
  1830.   stroke(21,3,.2,.0,.2);
  1831.   stroke(31,4,.1,.2,.2);
  1832.   stroke(41,5,.9,.2,0);
  1833.   labelpos(1,21,2,31,3,41,4,5);
  1834. enddef;
  1835.  
  1836. % x by William Burley
  1837. vardef char.x =
  1838.       setwidth .45em;
  1839.       pos1(1.4thickwidth,0);
  1840.       pos2(.9thickwidth,45);
  1841.       pos3(1.4thickwidth,0);
  1842.       pos4(1.4thinwidth,0);
  1843.       pos5(.9thinwidth,-45);
  1844.       pos6(1.4thinwidth,0);
  1845.       x1l=x4l=.1w;
  1846.       x3r=x6r=.9w;
  1847.       y1=y6=xheight;
  1848.       y3=y4=0;
  1849.       x2=x5=.5w;
  1850.       y2=y5=.5xheight;
  1851.       stroke(1,2,.15,0,.25);
  1852.       stroke(2,3,.85,.25,0);
  1853.       stroke(4,5,.15,0,.25);
  1854.       stroke(5,6,.85,.25,0);
  1855.       labelpos(1,2,3,4,5,6);
  1856. enddef;
  1857.  
  1858. % y by Neenie Billawala
  1859. vardef char.y=
  1860.      setwidth .57em;
  1861.      pos1(1.4thickwidth,15);   dz2=z2r-z1r;
  1862.      pos2(1.25thickwidth,60);
  1863.      pos3(1.65thinwidth,15);
  1864.      pos4(.85thinwidth,-45);
  1865.      pos5(1.65thinwidth,10);
  1866.      pos6(1.23thickwidth,50);
  1867.      pos7(1.5thinwidth,15);
  1868.      pos8(1.4thinwidth,0);
  1869.        y1=y3=xheight;
  1870.        z2=z4; y4r=0; x4l=.5w;
  1871.        numeric a;
  1872.        y5=-ydepth;
  1873.        x1l=.07w;
  1874.        x3r=w-.09x1l-.02em;
  1875.        z5=a[z3,z4];
  1876.        dz4=(z5-z3);
  1877.        z6r=.02[z1r,z2r];
  1878.          dz6=z2l-z1l; curve(1,6,2);
  1879.        %z7r=.08[z3r,z4r];
  1880.          %dz7=z4l-z3l; curve(3,7,4);
  1881.        %z8l=.92[z3l,z4l];
  1882.          %dz8=z4r-z3r; %curve(4,8,5);
  1883.        stroke(3,4,.2,.4,0);
  1884.        stroke(4,5,.8,0,.4);
  1885.      labelpos(1,2,3,4,5,6,7,8);
  1886. enddef;
  1887.  
  1888. % z by Kanchi Gopinath
  1889. vardef char.z=
  1890.   setwidth .43em;
  1891.  
  1892.   pos1(thickwidth,80);
  1893.   pos2(2thickwidth,30);
  1894.   pos3(2thickwidth,30);
  1895.   pos4(thickwidth,90);  % 90 is changed to 110 in his other file...
  1896.  
  1897.   x1l=0;
  1898.   y1l=xheight-thickwidth;
  1899.  
  1900.  
  1901.   y2r=xheight;
  1902.   x2r=w;
  1903.  
  1904.   x3l=0;
  1905.   y3l=0;
  1906.  
  1907.   x4l=w;
  1908.   y4l=0;
  1909.  
  1910.   stroke(1,2,.4,.3,.2);
  1911.   stroke(2,3,.5,.5,.5);
  1912.   stroke(3,4,0.6,0.2,0.3);
  1913.   labelpos(1,2,3,4);
  1914. enddef;
  1915.  
  1916. % - by Dan Mills
  1917. vardef char.hyphen =
  1918.     begingroup charcode:=ASCII"-";
  1919. %  charcd := '-;
  1920.   save glyphwidth,lsb,rsb;
  1921.   numeric glyphwidth,lsb,rsb;
  1922.  
  1923.   glyphwidth = .25em;
  1924.   lsb = .1glyphwidth;
  1925.   rsb = .1glyphwidth;
  1926.   setwidth( lsb+glyphwidth+rsb );
  1927.  
  1928. % positions:
  1929.   pos1(thinwidth,90);
  1930.   pos2(thinwidth,90);
  1931.  
  1932. % coordinates:
  1933.   x1 = lsb;    y1 = .55xheight;
  1934.   x2 = lsb + glyphwidth;  y2 = y1;
  1935.  
  1936. % specials:
  1937.   % none
  1938.  
  1939. % draw stroke:
  1940.   stroke(1,2,0,0,0);
  1941.  
  1942.   labelpos(1,2);
  1943.     endgroup;
  1944. enddef; % char.hyphen
  1945.  
  1946.  
  1947. % . by Dan Mills
  1948. vardef char.period =
  1949.     begingroup charcode:=ASCII".";
  1950. %  charcd := '.;
  1951.   save glyphwidth,lsb,rsb;
  1952.   numeric glyphwidth,lsb,rsb;
  1953.  
  1954.   glyphwidth = thickwidth;
  1955.   lsb = .6glyphwidth;
  1956.   rsb = .6glyphwidth;
  1957.   setwidth( lsb+glyphwidth+rsb );
  1958.  
  1959. % positions:
  1960.   pos1(thickwidth,90);
  1961.   pos2(thickwidth,90);
  1962.  
  1963. % coordinates:
  1964.   x1 = lsb;    y1l = 0;
  1965.   x2 = lsb + glyphwidth;  y2l = y1l;
  1966.  
  1967. % specials:
  1968.   % none
  1969.  
  1970. % draw stroke:
  1971.   stroke(1,2,0,0,0);
  1972.  
  1973.   labelpos(1,2);
  1974.     endgroup;
  1975. enddef; % char.period
  1976.  
  1977.  
  1978. % , by Dan Mills
  1979. vardef char.comma =
  1980.     begingroup charcode:=ASCII",";
  1981. %  charcd := ',;
  1982.   save glyphwidth,lsb,rsb;
  1983.   numeric glyphwidth,lsb,rsb;
  1984.  
  1985.   glyphwidth = thickwidth;
  1986.   lsb = .6glyphwidth;
  1987.   rsb = .6glyphwidth;
  1988.   setwidth( lsb+glyphwidth+rsb );
  1989.  
  1990. % positions:
  1991.   pos1(thickwidth,90);
  1992.   pos2(thickwidth,90);
  1993.   pos3(.7thickwidth,0);
  1994.   pos4(.3thickwidth,0);
  1995.  
  1996. % coordinates:
  1997.   x1 = lsb;    y1l = 0;
  1998.   x2 = lsb + glyphwidth;  y2l = y1l;
  1999.   x3r = x2;    y3 = y1l;
  2000.   x4l = x1;    y4 = -1.5thickwidth;
  2001.  
  2002. % specials:
  2003.   % none
  2004.  
  2005. % draw stroke:
  2006.   stroke(1,2,0,0,0);
  2007.   stroke(3,4,0,0,0);
  2008.  
  2009.   labelpos(1,2,3,4);
  2010.     endgroup;
  2011. enddef; % char.comma
  2012.  
  2013. % now we generate the font
  2014. % SELECT THE CORRECT init.... STATEMENT!
  2015.  
  2016. openwindow 0 from (0,0) to (420,500) at (-40,310);
  2017. window:=0;
  2018. %init.normal(1.618033);
  2019. %init.bold(1.618033);
  2020. init.boldx(1.618033);
  2021. vardef init.wierd(expr f) =
  2022.   begingroup
  2023.   numeric thinwidth,thickwidth,capheight,xheight,hheight,ydepth,em;
  2024.   thinwidth = 13f; thickwidth = 13f; em = 180f;
  2025.   capheight = 170f; xheight = 90f; hheight = 180f; ydepth = 60f;
  2026.   endgroup
  2027. enddef;
  2028. %init.wierd(sqrt2);
  2029.  
  2030.  
  2031. vardef make@#(expr ls,rs)=begingroup clear; charcode:=ASCII str@#;
  2032.  "the character "&str @#; char@#; chardx:=w+ls+rs; charwd:=chardx/hppp;
  2033. if proofing>.5: shipit;
  2034. else:
  2035. proofrule((0,hheight),(w+ls+rs,hheight));
  2036. proofrule((0,-ydepth),(w+ls+rs,-ydepth));
  2037. proofrule((0,-ydepth),(0,hheight));
  2038. proofrule((w+ls+rs,-ydepth),(w+ls+rs,hheight));
  2039. proofrule((0-10,0),(0+10,0));
  2040. proofrule((w+ls+rs-10,0),(w+ls+rs+10,0));
  2041.  shipout (currentpicture shifted (ls,0)); fi
  2042. endgroup enddef;
  2043.  
  2044.  
  2045. tracingtitles:=1;
  2046. make.A(-.025em,.05em);
  2047. make.B(0,-.025em);
  2048. make.C(-.02em,-.02em);
  2049. make.D(-.02em,0);
  2050. make.E(0,-.05em);
  2051. make.F(0,-.05em);
  2052. make.G(0,0);
  2053. make.H(0,0);
  2054. make.I(-.05em,-.05em);
  2055. make.J(0,0);
  2056. make.K(0,-.05em);
  2057. make.?(0,0);
  2058. make.L(0,-.02em);
  2059. make.M(0,0);
  2060. make.N(0,0);
  2061. make.O(0,0);
  2062. make.P(.05em,-.075em);
  2063. make.Q(0,0);
  2064. make.R(0,-.275em+thickwidth);
  2065. make.S(0,0);
  2066. make.T(-.05em,-.075em);
  2067. make.exclamation(0,-.075em);
  2068. make.U(0,0);
  2069. make.V(-.075em,0);
  2070. make.W(0,0);
  2071. make.X(-.05em,0);
  2072. make.Y(0,0);
  2073. make.Z(0,0);
  2074. make.a(-.05em,.5thickwidth);
  2075. make.b(0,-.025em);
  2076. make.c(.05em,0);
  2077. make.d(-.025em,0);
  2078. make.e(0,0);
  2079. make.f(0,0);
  2080. make.g(0,.01em);
  2081. make.h(0,0);
  2082. make.i(0,0);
  2083. make.j(-.05em,0);
  2084. make.k(-.02em,-.05em);
  2085. make.l(0,0);
  2086. make.m(0,0);
  2087. make.n(-.05em,.01em);
  2088. make.o(0,0);
  2089. make.p(.05em,0);
  2090. make.q(-.02em,0);
  2091. make.r(0,-.07em);
  2092. make.s(.05em,.05em);
  2093. make.t(-.025em,-.1em);
  2094. make.u(0,.04em);
  2095. make.v(-.025em,-.025em);
  2096. make.w(-.05em,-.05em);
  2097. make.x(0,0);
  2098. make.y(0,0);
  2099. make.z(.05em,.05em);
  2100. make.hyphen(0,0);
  2101. make.period(0,0);
  2102. make.comma(0,0);
  2103. fontdimen 1: 0, 1/3em/hppp, 1/6em/hppp, 1/9em/hppp, xheight/vppp,
  2104.   em/hppp, 1/9em/hppp;
  2105. end
  2106.